home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 4
/
United Public Domain Gold 4.iso
/
fredfish
/
ff.0431.dms
/
ff.0431.adf
/
A68Kex
/
RealIn.asm
< prev
next >
Wrap
Assembly Source File
|
1991-01-17
|
4KB
|
194 lines
* RealIn change ASCII inputted real number
* to numeric real
*
* IN
* a0 pointer to ASCII string
* OUT
* d0 real number
* d1 ok flag
* INTERNAL
* d2 sign of number
* d3 intermediate real
* d4 sign of exponent
* d5 value of exponent
*
* written by E. Lenz
* Johann-Fichte-Strasse 11
* 8 Munich 40
* Germany
***** exec *****
_AbsExecBase equ 4
_LVOCloseLibrary equ -$19e
_LVOOpenLibrary equ -$228
****** mathffp ******
_LVOSPFlt equ -$24
_LVOSPNeg equ -$3c
_LVOSPAdd equ -$42
_LVOSPMul equ -$4e
ten equ $a0000044
tenth equ $cccccd3d
XDEF RealIn
RealIn movem.l d2-d7/a1/a6,-(a7) save used registers
move.l #ten,d6
move.l #tenth,d7
move.l a0,-(a7) save pointer to ASCII
move.l _AbsExecBase,a6
lea FfpName,a1 open mathffp library
moveq #0,d0
jsr _LVOOpenLibrary(a6)
move.l (a7)+,a0
tst.l d0
beq bad
movea.l d0,a6
moveq #0,d3 value zero
moveq #0,d2 sign of number
moveq #0,d4 sign of exponent
moveq #0,d5 value of exponent
bsr.s sign
* 1st step convert until decimal point, e or blank
First cmpi.b #'.',(a0) test end of step condition
beq.s Point
bsr.s chke
beq Exp
bsr.s chkex
beq exit
move.l d6,d0 multiply result by 10
move.l d3,d1
jsr _LVOSPMul(a6)
move.l d0,d3
bsr chk09
bpl bad
jsr _LVOSPFlt(a6)
move.l d3,d1
jsr _LVOSPAdd(a6)
move.l d0,d3
bra.s First
; check if e or E
chke cmpi.b #'E',(a0)
beq.s ise
cmpi.b #'e',(a0)
ise rts
; check end of input
chkex cmpi.b #' ',(a0)
beq.s isex
cmpi.b #$a,(a0)
isex rts
; get sign
sign cmpi.b #'-',(a0) get sign of number
bne.s notm
move.b (a0)+,d2
bra.s return
notm cmpi.b #'+',(a0)
bne.s return
move.b (a0)+,d0
return rts
; step 2 convert decimal fraction
Point move.b (a0)+,d0 remove '.'
move.l d7,d1 d1 as value of position
Second bsr.s chke test end of step 2 condition
beq.s Exp
bsr.s chkex
beq.s exit
bsr.s chk09
bpl.s bad
move.l d1,-(a7)
jsr _LVOSPFlt(a6)
move.l (a7),d1
jsr _LVOSPMul(a6)
move.l d3,d1 add the numeral
jsr _LVOSPAdd(a6)
move.l d0,d3
move.l (a7)+,d0
move.l d7,d1 decrement value of position
jsr _LVOSPMul(a6)
move.l d0,d1
bra.s Second
Exp move.b (a0)+,d0 get rid of 'e'
exg d2,d4
bsr.s sign
exg d2,d4 sign of exponent
bsr.s chk09 get exponent
bpl.s bad
move.l d0,d5
bsr.s chk09
bpl.s nosec
moveq #10,d1
mulu d1,d5
add.l d0,d5
nosec tst.l d5
beq.s exit
move.l d3,d0
move.l d6,d1
subq.l #1,d5
tst.l d4
beq.s plus
move.l d7,d1
plus jsr _LVOSPMul(a6)
dbra d5,plus
move.l d0,d3
bra.s exit
bad moveq #1,d1
bra.s noneg
; check if decimal
chk09 moveq #0,d0
move.b (a0)+,d0
subi.b #'0',d0
bmi.s bad1
cmpi.b #$a,d0
bge.s bad1
rts
bad1 moveq #0,d0
rts
exit move.l d3,d0
tst.l d2
beq.s non
jsr _LVOSPNeg(a6)
non moveq #0,d1
noneg movem.l d0-d1,-(a7)
move.l a6,d1
beq.s noFfp
move.l _AbsExecBase,a6 close mathffp library
movea.l d1,a1
jsr _LVOCloseLibrary(a6)
noFfp movem.l (a7)+,d0-d1
movem.l (a7)+,d2-d7/a1/a6
rts
FfpName dc.b 'mathffp.library',0
even
end